
/******************** item_26: 尽可能延后变量定义式的出现时间 ****************************/

// example：
#include <string>

static const int MinimumPasswordLength = 16;

// 这个函数过早定义变量 "encrypted"
std::string encryptPassword(const std::string& password)
{
    using namespace std;
    string encrypted;
    if (password.length() < MinimumPasswordLength) {
        throw logic_error("Password is too short");     // 类型为 logic_error（定义在C++ 标准程序库）
    }

    // ...                      // 必要动作，能将一个加密后的密码置入变量 encrypted 内

    return encrypted;
}

// 这个函数延后 "encrypted" 的定义，直到真正需要它
std::string encryptPassword(const std::string& password)
{
    using namespace std;
    if (password.length() < MinimumPasswordLength) {
        throw logic_error("Password is too short");     // 类型为 logic_error（定义在C++ 标准程序库）
    }
    string encrypted;
    // ...                      // 必要动作，能将一个加密后的密码置入变量 encrypted 内

    return encrypted;
}

// 加密函数
void encrypt(std:: string& s);  // 在其中的适当地点对 s 加密

// 终于，这是定义并初始化 encrypted 的最佳做法
std::string encryptPassword(const std::string& password)
{
    using namespace std;
    if (password.length() < MinimumPasswordLength) {    // 检查长度
        throw logic_error("Password is too short");     // 类型为 logic_error（定义在C++ 标准程序库）
    }
    string encrypted(password);     // 通过 copy 构造函数，定义并初始化
    encrypt(encrypted);             // 必要动作，能将一个加密后的密码置入变量 encrypted 内

    return encrypted;
}

// 循环中定义变量
class Widget {
    // ...
};

// 方法 A: 将变量定义循环外
Widget w;
int n;
for (int i = 0; i < n; ++i) {
    // w = 取决于 i 的某值;
    // ...
}

// 方法 B: 将变量定义于循环内
for (int i = 0; i < n; ++i) {
    // Widget w(取决于 i 的某个值)
    // ...
}

// 在 Widget 函数内部，以上两种写法的成本如下：
// 做法 A：1 个构造函数 + 1 个析构函数 + n 个赋值操作
// 做法 B：n 个构造函数 + n 个析构函数

// 如果 classes 的一个赋值成本低于一组构造+析构成本，做法A大体而言比较高效。一般情况选择做法 B。

// 总结：
// 1. 尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序的效率。